/*
 * @Author: yanbinbin
 * @Date: 2021-04-21 17:53:44
 * @LastEditTime: 2021-04-22 16:11:46
 * @LastEditors: Please set LastEditors
 * @Description: Notificaiton 数据流动方式是从子widget向上传递至父widget，
 * 如果想要实现自定义通知，我们首先需要继承 Notification 类。
 * Notification 类提供了 dispatch 方法，可以让我们沿着 context 对应的 Element 节点树向上逐层发送通知。
 * @FilePath: \inherited_widget\lib\notification_widget.dart
 */

import 'package:flutter/material.dart';

//首先需要继承 Notification 类。
//Notification 类提供了 dispatch 方法，可以让我们沿着 context 对应的 Element 节点树向上逐层发送通知。
class CustomNotification extends Notification {
  CustomNotification(this.msg);
  final String msg;
}

//抽离出一个子Widget用来发通知
class CustomChild extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      //按钮点击时分发通知
      onPressed: () => CustomNotification("Hi").dispatch(context),
      child: Text("Fire Notification"),
    );
  }
}

class NotificationWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _NotificationState();
}

//而在子 Widget 的父 Widget 中，我们监听了这个通知，一旦收到通知，就会触发界面刷新，展示收到的通知信息：
class _NotificationState extends State<NotificationWidget> {
  String _msg = "通知：";
  @override
  Widget build(BuildContext context) {
    //监听通知
    return NotificationListener<CustomNotification>(
        onNotification: (notification) {
          //收到子Widget通知，更新msg
          setState(() {
            _msg += notification.msg + "  ";
          });
          return false;
        },
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[Text(_msg), CustomChild()],
        ));
  }
}
